﻿using Emc.InputAccel.CaptureClient;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using mapfre.odeon;
using System.Windows.Forms;
using Emc.InputAccel.UimScript;

namespace GENERALITAT_CATALUNYA
{
    public class asignar_notas_custom : CustomCodeModule
    {
        public override bool SetupCodeModule(Control parentWindow, IValueAccessor stepConfiguration)
        {
            return true;
        }
         
        public override void ExecuteTask(IClientTask task, IBatchContext batchContext)
        {
            try
            {
                LogManager.log("=============================================================");
                LogManager.log("Incio Ejecución Módulo ASIGNAR_NOTAS_CUSTOM");
                LogManager.log("Iniciando ejecución para lote: " + batchContext.BatchName + " con ID: " + batchContext.BatchId + "Fecha/hora: " + DateTime.Now.ToString());

                IBatchNode nodo_custom = batchContext.GetStepNode(task.BatchNode, "CustomValues");
                IBatchNode nodo_extraccion_manual = batchContext.GetStepNode(task.BatchNode, "Extraccion_Manual");

                string uimdata = nodo_extraccion_manual.NodeData.ValueSet.ReadString("UimData");

                IUimDataContext data = nodo_extraccion_manual.NodeData.StringToUimData(uimdata);
                               
                LogManager.log("Leyendo UIMDATA");
                Dictionary<String,String> respuestas = new Dictionary<String,String>();
                
                string contador_pregunta = string.Empty;
                string valoracion_prueba = string.Empty;
                int bandera_respuesta_correcta = 1;
                

                string ausente = (String)nodo_extraccion_manual.NodeData.StringToUimData(uimdata).FindFieldDataContext("Ausente").Value;
                LogManager.log("Leyendo Campo: Ausente");
                LogManager.log("Valor: "+ausente);
                ausente = ausente.ToUpper();

                if (!ausente.Equals("X"))
                {
                    foreach (IUimFieldDataContext campo in data.GetFieldDataContextArray())
                    {
                        LogManager.log("Leyendo Campo: " + campo.Name);

                        if (campo.Name.Contains("Campo"))
                        {
                            string[] nombre_pregunta = campo.Name.Split('o'); //Campo1_a_1
                            string[] num_pregunta = nombre_pregunta[1].Split('_');//1_a_1

                            string numpregunta_anterior = contador_pregunta;

                            if (num_pregunta.Length > 2)
                            {
                                contador_pregunta = num_pregunta[0] + "." + num_pregunta[1];//1.1
                            }
                            else
                            {
                                contador_pregunta = num_pregunta[0];//1
                            }
                            if (!contador_pregunta.Equals(numpregunta_anterior))
                            {
                                if (bandera_respuesta_correcta == 0)
                                {
                                    if (!respuestas.ContainsKey(numpregunta_anterior))
                                    {
                                        respuestas.Add(numpregunta_anterior, "N,");
                                    }
                                    else
                                    {
                                        respuestas[numpregunta_anterior] = "N,";
                                    }
                                }
                                else
                                {
                                    bandera_respuesta_correcta = 0;
                                }
                            }


                            if (campo.Name.Contains("_a"))
                            {

                                if (campo.ValueAsString.Equals("X") || campo.ValueAsString.Equals("x"))
                                {
                                    if (!respuestas.ContainsKey(contador_pregunta))
                                    {
                                        respuestas.Add(contador_pregunta, "a,");
                                        bandera_respuesta_correcta = 1;
                                    }
                                    else
                                    {
                                        respuestas[contador_pregunta] = "N,";
                                    }

                                    LogManager.log("Asigando valor a cadena: " + respuestas[contador_pregunta]);
                                }

                            }

                            if (campo.Name.Contains("_b"))
                            {
                                if (campo.ValueAsString.Equals("X") || campo.ValueAsString.Equals("x"))
                                {
                                    if (!respuestas.ContainsKey(contador_pregunta))
                                    {
                                        respuestas.Add(contador_pregunta, "b,");
                                        bandera_respuesta_correcta = 1;
                                    }
                                    else
                                    {
                                        respuestas[contador_pregunta] = "N,";
                                    }
                                    LogManager.log("Asigando valor a cadena: " + respuestas[contador_pregunta]);
                                }
                               
                            }
                            if (campo.Name.Contains("_c"))
                            {
                                if (campo.ValueAsString.Equals("X") || campo.ValueAsString.Equals("x"))
                                {
                                    if (!respuestas.ContainsKey(contador_pregunta))
                                    {
                                        respuestas.Add(contador_pregunta, "c,");
                                        bandera_respuesta_correcta = 1;
                                    }
                                    else
                                    {
                                        respuestas[contador_pregunta] = "N,";
                                    }
                                    LogManager.log("Asigando valor a cadena: " + respuestas[contador_pregunta]);
                                }
                                                           
                            }
                            if (campo.Name.Contains("_d"))
                            {
                                if (campo.ValueAsString.Equals("X") || campo.ValueAsString.Equals("x"))
                                {
                                    if (!respuestas.ContainsKey(contador_pregunta))
                                    {
                                        respuestas.Add(contador_pregunta, "d,");
                                        bandera_respuesta_correcta = 1;
                                    }
                                    else
                                    {
                                        respuestas[contador_pregunta] = "N,";
                                    }
                                    LogManager.log("Asigando valor a cadena: " + respuestas[contador_pregunta]);
                                }
                               
                            }

                        }

                    }

                    //Si la ultima pregunta esta vacía, es que no existe en el mapa, con lo cual respuesta nula
                    if (!respuestas.ContainsKey(contador_pregunta))
                    {
                        respuestas.Add(contador_pregunta, "N,");
                        bandera_respuesta_correcta = 1;
                    }

                    //Valoracion prueba
                    string muy_facil = (String)nodo_extraccion_manual.NodeData.StringToUimData(uimdata).FindFieldDataContext("Muy_facil").Value;
                    string facil = (String)nodo_extraccion_manual.NodeData.StringToUimData(uimdata).FindFieldDataContext("Facil").Value;
                    string dificil = (String)nodo_extraccion_manual.NodeData.StringToUimData(uimdata).FindFieldDataContext("Dificil").Value;
                    string muy_dificil = (String)nodo_extraccion_manual.NodeData.StringToUimData(uimdata).FindFieldDataContext("Muy_dificil").Value;

                    if (muy_facil.Equals("x") || muy_facil.Equals("X"))
                    {
                        valoracion_prueba = "1";
                    }
                    else if (facil.Equals("x") || facil.Equals("X"))
                    {
                        valoracion_prueba = "2";
                    }
                    else if (dificil.Equals("x") || dificil.Equals("X"))
                    {
                        valoracion_prueba = "3";
                    }
                    else if (muy_dificil.Equals("x") || muy_dificil.Equals("X"))
                    {
                        valoracion_prueba = "4";
                    }
                    else
                    {
                        valoracion_prueba = "0";
                    }

                    //verificación de las repuestas
                    List<string> valores = respuestas.Values.ToList<string>();

                    string cad = String.Empty;
                    foreach (string s in valores)
                    {
                        cad = cad + s;
                    }

                    nodo_custom.NodeData.ValueSet.WriteString("Respuestas_alumno", cad);
                    nodo_custom.NodeData.ValueSet.WriteString("Valoracion_prueba", valoracion_prueba);

                    LogManager.log("RESPUESTAS ALUMNO: " + cad);
                    
                }
                else
                {
                    LogManager.log("EL ALUMNO ESTÁ AUSENTE, no se porcesan los datos");
                    nodo_custom.NodeData.ValueSet.WriteString("Ausente", "S");
                }
                LogManager.log("\n=============================================================");
                task.CompleteTask();
            }
            catch(Exception ex)
            {
                LogManager.log("ERROR EN ASIGNAR_NOTAS_CUSTOM");
                LogManager.log("ERROR: "+ex.Message);
                LogManager.log("STACKTRACE: "+ex.StackTrace);
                task.FailTask(FailTaskReasonCode.GenericUnrecoverableError, ex);
            }
        }

        public override void StartModule(ICodeModuleStartInfo startInfo)
        {
            LogManager.moduleInfo = startInfo;
        }

    }
}
